#ifndef _INTERRUPT_H__
#define _INTERRUPT_H__
#ifdef __cplusplus
extern "C"
{
#endif

    /*
        Chinese is encoded in Unicode. If it is garbled, please change the encoding method of the editor.
        中断库 By启凡科创 适用于STC8、STC15平台MCU
        version:v1.0.1  2023-1-14
    */

#include "LIB_CONFIG.h"

#ifndef INT0_ENABLE_EN
#define INT0_ENABLE_EN 0 // 外部中断0编译使能，1启用，0禁用,需没有在LIB_CONFIG.h中启用此参数才会生效
#endif

#ifndef INT1_ENABLE_EN
#define INT1_ENABLE_EN 0 // 外部中断0编译使能，1启用，0禁用,需没有在LIB_CONFIG.h中启用此参数才会生效
#endif

#ifndef INT2_ENABLE_EN
#define INT2_ENABLE_EN 0 // 外部中断0编译使能，1启用，0禁用,需没有在LIB_CONFIG.h中启用此参数才会生效
#endif

#ifndef INT3_ENABLE_EN
#define INT3_ENABLE_EN 0 // 外部中断0编译使能，1启用，0禁用,需没有在LIB_CONFIG.h中启用此参数才会生效
#endif

#ifndef INT4_ENABLE_EN
#define INT4_ENABLE_EN 0 // 外部中断0编译使能，1启用，0禁用,需没有在LIB_CONFIG.h中启用此参数才会生效
#endif

#if (INT0_ENABLE_EN | INT1_ENABLE_EN | INT2_ENABLE_EN | INT3_ENABLE_EN | INT4_ENABLE_EN)
    typedef enum
    {
#if INT0_ENABLE_EN
        interrupt_0, // 外部中断0
#endif
#if INT1_ENABLE_EN
        interrupt_1, // 外部中断1
#endif
#if INT2_ENABLE_EN
        interrupt_2, // 外部中断2
#endif
#if INT3_ENABLE_EN
        interrupt_3, // 外部中断3
#endif
#if INT4_ENABLE_EN
        interrupt_4, // 外部中断4
#endif
    } interrupt_t;

    typedef enum
    {
        RISING,  // 上升沿
        FALLING, // 下降沿
        CHANGE,  // 上升沿+下降沿
    } interrupt_modes;

    /**
     * @brief 配置外部中断
     *
     * @param intr_t 中断号:
     * @param ··interrupt_0 外部中断0，支持所有中断方式
     * @param ··interrupt_1 外部中断1，支持所有中断方式
     * @param ··interrupt_2 外部中断2，仅支持下降沿中断
     * @param ··interrupt_3 外部中断3，仅支持下降沿中断
     * @param ··interrupt_4 外部中断4，仅支持下降沿中断
     * @param --
     * @param func 中断回调函数,格式为void name();
     * @param --
     * @param mode 中断模式:
     * @param ··RISING 上升沿
     * @param ··FALLING 下降沿
     * @param ··CHANGE 上升沿+下降沿
     */
    void interrupt_config(interrupt_t intr_t, void (*func)(), interrupt_modes mode);

    /**
     * @brief 使能外部中断,请先用interrupt_config接口配置正确后再使能，否则将使能失败
     *
     * @param intr_t 中断号:
     * @param interrupt_0 外部中断0，支持所有中断方式
     * @param interrupt_1 外部中断1，支持所有中断方式
     * @param interrupt_2 外部中断2，仅支持下降沿中断
     * @param interrupt_3 外部中断3，仅支持下降沿中断
     * @param interrupt_4 外部中断4，仅支持下降沿中断
     * @param --
     */
    void interrupt_enable(interrupt_t intr_t);

    /**
     * @brief 关闭外部中断
     *
     * @param intr_t 中断号:
     * @param interrupt_0 外部中断0，支持所有中断方式
     * @param interrupt_1 外部中断1，支持所有中断方式
     * @param interrupt_2 外部中断2，仅支持下降沿中断
     * @param interrupt_3 外部中断3，仅支持下降沿中断
     * @param interrupt_4 外部中断4，仅支持下降沿中断
     * @param --
     */
    void interrupt_disable(interrupt_t intr_t);

#endif
#ifdef __cplusplus
}
#endif
#endif
